/*
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License"),
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @addtogroup TeeTrusted
 * @{
 *
 * @brief TEE（Trusted Excution Environment）可信执行环境API。
 *
 * 提供安全能力API，例如可信存储、加解密及可信时间等，用于可信应用程序开发。
 *
 * @since 20
 */

/**
 * @file tee_apm_api.h
 *
 * @brief 提供关于TA APM的API。
 *
 * @library NA
 * @kit TEEKit
 * @syscap SystemCapability.Tee.TeeClient
 * @include <TEEKit/tee_apm_api.h>
 * @since 20
 */

#ifndef TEE_APM_API_H
#define TEE_APM_API_H

#include "tee_defines.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief 枚举TEE度量结果值。
 *
 * @since 20
 */
enum tee_measure_result_value {
    /** 度量成功。 */
    TEE_MEASURE_SUCCESS                            = 0x00000000,
    /** 通用错误。 */
    TEE_MEASURE_ERROR_GENERIC                      = 0x00000001,
    /** TA哈希检查失败。 */
    TEE_MEASURE_ERROR_TA_HASH_CHECK_FAILED         = 0x00000002,
    /** TA基线不存在。 */
    TEE_MEASURE_ERROR_TA_BASELINE_NOT_EXIST        = 0x00000003,
    /** TA内存哈希不存在。 */
    TEE_MEASURE_ERROR_TA_MEMHASH_NOT_EXIST         = 0x00000004,
    /** 权限被拒绝。 */
    TEE_MEASURE_ERROR_PERMISSION_DENY              = 0x00000005,
    /** TA历史度量不存在。 */
    TEE_MEASURE_ERROR_TA_HISTORY_MEASURE_NOT_EXIST = 0x00000006,
    /** MSPC报告查询失败。 */
    TEE_MEASURE_ERROR_MSPC_REPORT_QUERY_FAILED     = 0x00000007,
    /** MSPC不支持。 */
    TEE_MEASURE_ERROR_MSPC_NOT_SUPPORT             = 0x00000008,
    /** 报告不支持。 */
    TEE_MEASURE_ERROR_REPORT_NOT_SUPPORT           = 0x00000009,
    /** APM不支持。 */
    TEE_MEASURE_ERROR_APM_NOT_SUPPORT              = 0x0000000a,
};

/**
 * @brief 记录最近的度量错误。
 *
 * @since 20
 */
#define MAX_HISTORY_MEASURE_RECORDS_NUM 10

/**
 * @brief 定义度量错误的历史记录。
 *
 * @since 20
 */
struct history_measure_result_t {
    /** 最近的度量错误次数。 */
    uint8_t error_num;
    /** 度量错误的类型。 */
    uint32_t error_type[MAX_HISTORY_MEASURE_RECORDS_NUM];
    /** 度量错误发生的时间。 */
    uint64_t error_time[MAX_HISTORY_MEASURE_RECORDS_NUM];
};

/**
 * @brief 定义TA哈希的大小。
 *
 * @since 20
 */
#define TA_HASH_SIZE 32

/**
 * @brief 定义TA度量报告的结构体。
 *
 * @since 20
 */
struct ta_measure_report_t {
    /** TA的UUID。 */
    TEE_UUID uuid;
    /** TA的度量结果。 */
    uint32_t measure_result;
    /** TA的度量哈希。 */
    uint8_t ta_measured[TA_HASH_SIZE];
    /** TA的基线哈希。 */
    uint8_t ta_baseline[TA_HASH_SIZE];
    /** 历史度量错误。 */
    struct history_measure_result_t history_result;
};

/**
 * @brief 查询TA度量报告。
 *
 * @param uuid 指向TA的UUID。
 * @param report 指向存储度量报告结果的结构体。
 *
 * @return TEE_SUCCESS：返回查询结果成功。\n
 *         失败时返回相应错误码。
 * @since 20
 */
TEE_Result tee_query_ta_measure_report(const TEE_UUID *uuid, struct ta_measure_report_t *report);

/**
 * @brief 定义MSPC度量报告元素的结构体。
 *
 * @since 20
 */
struct mspc_metric_report_element_t {
    /** 基线状态。 */
    uint32_t baseline_status;
    /** 最近一次错误。 */
    uint32_t recent_error;
    /** 错误类型。 */
    uint32_t error_class;
    /** 错误发生时间。 */
    uint32_t error_time;
};

/**
 * @brief 定义MSPC度量结果报告的子结构体。
 *
 * @since 20
 */
struct mspc_metric_result_report_sub {
    /** 全局度量结果。 */
    struct mspc_metric_report_element_t global_result;
    /** BL2度量结果。*/
    struct mspc_metric_report_element_t bl2_result;
    /** BL31度量结果。 */
    struct mspc_metric_report_element_t bl31_result;
    /** TEE度量结果。 */
    struct mspc_metric_report_element_t tee_result;
};

/**
 * @brief 定义MSPC度量结果报告中被动部分的结构体。
 *
 * @since 20
 */
struct mspc_metric_result_report_passive {
    /** BL2验证结果。 */
    struct mspc_metric_report_element_t bl2_verify_result;
    /** TEE主动防护度量结果。 */
    struct mspc_metric_report_element_t tee_active_protect;
};

/**
 * @brief 定义MSPC度量结果报告中命令处理部分的结构体。
 *
 * @since 20
 */
struct mspc_metric_result_report_of_cmd_process {
    /** 基线命令的度量结果。 */
    struct mspc_metric_report_element_t cmd_baseline;
    /** 主动命令的度量结果。 */
    struct mspc_metric_report_element_t cmd_active_metric;
    /** 被动命令的度量结果。 */
    struct mspc_metric_report_element_t cmd_passive_metric;
    /** 查询命令的度量结果。 */
    struct mspc_metric_report_element_t cmd_query_result;
};

/**
 * @brief 定义MSPC度量结果报告的结构体。
 *
 * @since 20
 */
struct mspc_metric_result_report_t {
    /** 最终度量结果。 */
    uint32_t final_result;
    /** 基线度量报告。 */
    struct mspc_metric_result_report_sub baseline_report;
    /** 空闲状态的度量报告。 */
    struct mspc_metric_result_report_sub idle_metric_report;
    /** 主动状态的度量报告。 */
    struct mspc_metric_result_report_sub active_metric_report;
    /** 被动状态的度量报告。 */
    struct mspc_metric_result_report_passive passive_metric_report;
    /** 命令处理的度量报告。 */
    struct mspc_metric_result_report_of_cmd_process cmd_process_report;
};

/**
 * @brief 查询MSPC度量报告。
 *
 * @param report 存储MSPC度量报告的结构体。
 *
 * @return TEE_SUCCESS：操作成功。\n
 *         否则返回其他信息。
 * @since 20
 */
TEE_Result tee_query_mspc_measure_report(struct mspc_metric_result_report_t *report);

#ifdef __cplusplus
}
#endif

#endif
/** @} */